package com.happysmile.tcpconfig;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.happysmile.tcpconfig.model.TcpconfigAddDto;
import com.happysmile.tcpconfig.mybatis.entity.Config;
import com.happysmile.tcpconfig.mybatis.entity.Tcpconfig;
import com.happysmile.tcpconfig.mybatis.mapper.ConfigMapper;
import com.happysmile.tcpconfig.mybatis.mapper.TcpconfigMapper;
import com.happysmile.tcpconfig.outter.R;
import io.swagger.annotations.ApiOperation;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.lang.reflect.Field;

/*
* Dto 层，在内存中。用于保存前端和后端交互的数据。在此类中，用于保存TcpConfigAdd。
* 因此，配置文件在内存中。
* 配置文件可以实例化为tcpdumpconfig的一个参数区和后缀区。
* 这就是默认的配置文件。
*       tcpconfig cid unique.
*       增加什么的都在内存.
*       默认配置是系统推荐的初始化配置，存在于硬盘。
* */
@RestController
@SpringBootApplication
@RequestMapping("/config")
@MapperScan("com.happysmile.tcpconfig.mybatis.mapper")
public class TcpconfigApplication {


    //常驻内存,用于和前端打交道
    //配置中缀信息
    private static TcpconfigAddDto tcpconfigAddDto = new TcpconfigAddDto().init();

    @Resource
    private ConfigMapper configMapper;

    @Resource
    private TcpconfigMapper tcpconfigMapper;

    public static void main(String[] args) {
        SpringApplication.run(TcpconfigApplication.class, args);
    }

    /*
    * 更新 == 增加，无法删除
    * */
    @PostMapping("/update")
    @ApiOperation("更新配置")
    public R updateConfig(@RequestBody TcpconfigAddDto tcpconfigAddDto){
        if (tcpconfigAddDto == null) return R.fail("更新失败");
        this.tcpconfigAddDto = tcpconfigAddDto;
        return R.success("更新成功");
    }

    //根据config id来取得唯一的tcpdump id
    @GetMapping("/{id}/reduction")
    @ApiOperation("还原配置")
    public R reductionConfig(@PathVariable String id){
        //从数据库中取出config
        Config config = configMapper.selectById(id);
        //再根据config去tcpconfig找。
        Tcpconfig tcpconfig = tcpconfigMapper.selectOne(new QueryWrapper<Tcpconfig>().eq("cid", config.getId()));//因为仅仅可能插入一条数据。因为这条是系统默认的。
        //取出默认配置
        String params = tcpconfig.getParams();
        String[] split = params.split("-");
        for (String s : split) {
            //拿到参数
            String trim = s.trim();
            //反射遍历,封装对象
            try{
                Class<? extends TcpconfigAddDto> aClass = tcpconfigAddDto.getClass();
                Field[] declaredFields = aClass.getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    String name = declaredField.getName();
                    Object value = declaredField.get(aClass);
                    //如果取到你了，那么把你的值赋值为true
                    if (name.equals(trim)){
                        declaredField.set(value,true);
                    }
                }
            }catch (Exception e){}
            //反射结束
        }
        return R.success();
    }



}
